﻿using System;
using System.Collections.Generic;
using System.Text;
using Business.Entities;
using System.Data;
using System.Data.SqlClient;

namespace Data.Database
{
    public class PersonaAdapter:Adapter
    {
       
        public List<Persona> GetAll() //correcto
        {
            try 
            {
                List<Persona> ListaPersonas = new List<Persona>();
                this.OpenConnection();
                SqlCommand cmdMaterias = new SqlCommand("select * from personas p inner join planes pl on " +
                    "p.id_plan=pl.id_plan order by p.tipo_persona, p.legajo", sqlConn);
                SqlDataReader reader = cmdMaterias.ExecuteReader();

                while (reader.Read())
                {
                    Persona PersonaActual = new Persona();
                    PersonaActual.ID = (int)reader["id_persona"];
                    PersonaActual.Nombre = (string)reader["nombre"];
                    PersonaActual.Apellido = (string)reader["apellido"];
                    PersonaActual.Direccion = (string)reader["direccion"];
                    PersonaActual.Email = (string)reader["email"];
                    PersonaActual.FechaNacimiento = (DateTime)reader["fecha_nac"];
                    PersonaActual.IDPlan = (int)reader["id_plan"];
                    PersonaActual.TipoPersona = (Persona.TiposPersonas)reader["tipo_persona"];
                    PersonaActual.Legajo = (int)reader["legajo"];
                    PersonaActual.Telefono = (string)reader["telefono"];
                    PersonaActual.DescripcionPlan= (string)reader["desc_plan"];
                    ListaPersonas.Add(PersonaActual);
                }
                reader.Close();
                return ListaPersonas;
            }
            catch (Exception ex)
            {
                Exception exManejada = new Exception("Error al actualizar en base de datos", ex);
                throw exManejada;
            }
            finally
            {
                this.CloseConnection();
            }
        }
        
        public Persona GetOne(int ID) //correcto
        {
            try
            {
                this.OpenConnection();
                SqlCommand cmdGetPersona = new SqlCommand("select * from personas p where @id=p.id_persona", sqlConn);
                cmdGetPersona.Parameters.Add("@id", typeof(int)).Value = ID;
                SqlDataReader sqlreader = cmdGetPersona.ExecuteReader();
                Persona perEncontrada = new Persona();
                while (sqlreader.Read())
                {
                    perEncontrada.ID = (int)sqlreader["id_persona"];
                    perEncontrada.Nombre = (string)sqlreader["nombre"];
                    perEncontrada.Apellido = (string)sqlreader["apellido"];
                    perEncontrada.Direccion = (string)sqlreader["direccion"];
                    perEncontrada.Email = (string)sqlreader["email"];
                    perEncontrada.FechaNacimiento = (DateTime)sqlreader["fecha_nac"];
                    perEncontrada.IDPlan = (int)sqlreader["id_plan"];
                    perEncontrada.Telefono = (string)sqlreader["telefono"];
                    perEncontrada.TipoPersona = (Persona.TiposPersonas)sqlreader["tipo_persona"];
                    perEncontrada.Legajo = (int)sqlreader["legajo"];
                }
                sqlreader.Close();
                return perEncontrada;
            }
            catch (Exception ex)
            {
                Exception exManejada = new Exception("Error al actualizar en base de datos", ex);
                throw exManejada;
            }
            finally
            {
                this.CloseConnection();
            }

        }

        public void Delete(Persona per) //correcto
        {
            try
            {
                this.OpenConnection();
                SqlCommand cmdPer = new SqlCommand("delete from personas where id_persona=@id_per", sqlConn);
                cmdPer.Parameters.Add("@id_per", typeof(int)).Value = per.ID;
                cmdPer.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Exception exManejada = new Exception("Error al actualizar en base de datos", ex);
                throw exManejada;
            }
            finally
            {
                this.CloseConnection();
            }
 
        }

        public void Save(Persona persona) //correcto
        {
            try
            {
                this.OpenConnection();
                if (persona.State == Persona.States.New)
                {
                    SqlCommand cmdPer = new SqlCommand("insert into personas(nombre, apellido, direccion, email, telefono, fecha_nac, legajo, " +
                            "tipo_persona, id_plan) values(@nombre, @apellido, @direccion, @email, @telefono, @fecha_nac, @legajo, " +
                            "@tipo_persona, @id_plan)", this.sqlConn);
                    cmdPer.Parameters.Add("@nombre", typeof(string)).Value = persona.Nombre;
                    cmdPer.Parameters.Add("@apellido", typeof(string)).Value = persona.Apellido;
                    cmdPer.Parameters.Add("@direccion", typeof(string)).Value = persona.Direccion;
                    cmdPer.Parameters.Add("@email", typeof(string)).Value = persona.Email;
                    cmdPer.Parameters.Add("@telefono", typeof(string)).Value = persona.Telefono;
                    cmdPer.Parameters.Add("@fecha_nac", typeof(DateTime)).Value = persona.FechaNacimiento;
                    cmdPer.Parameters.Add("@legajo", typeof(int)).Value = persona.Legajo;
                    cmdPer.Parameters.Add("@tipo_persona", typeof(Persona.TiposPersonas)).Value = persona.TipoPersona;
                    cmdPer.Parameters.Add("@id_plan", typeof(int)).Value = persona.IDPlan;

                    cmdPer.ExecuteNonQuery();
                }

                else if (persona.State == Persona.States.Modified)
                {
                    SqlCommand cmdPer = new SqlCommand("update personas set nombre=@nombre, apellido=@apellido, direccion=@direccion, " +
                        "email=@email, telefono=@telefono, fecha_nac=@fecha_nac, legajo=@legajo, tipo_persona=@tipo_persona, id_plan=@id_plan " +
                        " where id_persona=@id_persona", this.sqlConn);
                    cmdPer.Parameters.Add("@id_persona", typeof(int)).Value = persona.ID;
                    cmdPer.Parameters.Add("@nombre", typeof(string)).Value = persona.Nombre;
                    cmdPer.Parameters.Add("@apellido", typeof(string)).Value = persona.Apellido;
                    cmdPer.Parameters.Add("@direccion", typeof(string)).Value = persona.Direccion;
                    cmdPer.Parameters.Add("@email", typeof(string)).Value = persona.Email;
                    cmdPer.Parameters.Add("@telefono", typeof(string)).Value = persona.Telefono;
                    cmdPer.Parameters.Add("@fecha_nac", typeof(DateTime)).Value = persona.FechaNacimiento;
                    cmdPer.Parameters.Add("@legajo", typeof(int)).Value = persona.Legajo;
                    cmdPer.Parameters.Add("@tipo_persona", typeof(Persona.TiposPersonas)).Value = persona.TipoPersona;
                    cmdPer.Parameters.Add("@id_plan", typeof(int)).Value = persona.IDPlan;

                    cmdPer.ExecuteNonQuery();
                }
                else if (persona.State == Materias.States.Unmodified)
                {

                }
            }
            catch (Exception ex)
            {
                Exception exManejada = new Exception("Error al actualizar en base de datos", ex);
                throw exManejada;
            }
            finally
            {
                this.CloseConnection();
            }
        }     
    }
}
